package org.xu.utils;


import com.core.exception.BzException;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.apache.poi.ss.usermodel.*;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class ExcelUtils {

    public static Sheet getExcelSheet(MultipartFile file) {
        // 创建对Excel工作簿文件的引用
        if (file == null) {
            throw new BzException("excel不能为null");
        }
        try (InputStream inputStream = file.getInputStream()) {
            ZipSecureFile.setMinInflateRatio(-1.0d);
            Workbook workbook = WorkbookFactory.create(inputStream);
            if (workbook != null) {
                // 在Excel文档中，第一张工作表的缺省索引是0
                Sheet sheet = workbook.getSheetAt(0);
                return sheet;
            }
            return null;
        } catch (Exception e) {
            log.error("ExcelUtils.getExcelSheet 解析Excel出错", e);
            return null;
        }

    }

    /**
     * 读取excel转化为数组
     *
     * @param sheet
     * @param tableHeads
     * @return
     * @throws ParseException
     */
    public static List<Object[]> getListExcelData(Sheet sheet, String[] tableHeads) throws ParseException {
        // 获取到Excel文件中的所有行数
        int rows = sheet.getLastRowNum();
        log.info("获取到Excel文件中的所有行数:{}", rows);
        List<Object[]> templateFieldTemps = new ArrayList<>();
        //表头
        int columnsSize = tableHeads.length;
        log.info("获取到Excel文件中的所有列数:{}", columnsSize);
        Row row;
        Object[] objs;
        String value;
        for (int i = 0; i <= rows; i++) {
            // 获取每一行
            row = sheet.getRow(i);
            if (row != null) {
                // 遍历列
                if (i == 0) {
                    // 判断表头是否符合规范
                    for (int j = 0; j < columnsSize; j++) {
                        value = getCellValue(row.getCell(j));// 获取列的值
                        if (!tableHeads[j].equals(value)) {
                            throw new BzException("导入文件表头不正确，请核实！");
                        }
                    }
                } else {
                    // 遍历数据行
                    objs = new Object[columnsSize];
                    for (int j = 0; j < columnsSize; j++) {
                        value = getCellValue(row.getCell(j));// 获取列的值
                        objs[j] = value;
                    }
                    templateFieldTemps.add(objs);
                }
            }
        }
        log.info("获取到Excel文件中数据行数:{}", templateFieldTemps.size());
        return templateFieldTemps;
    }

    /**
     * 获取excel单元格的值
     *
     * @param cell
     * @return
     */
    public static String getCellValue(Cell cell) {
        String value = "";
        if (cell != null) {
            switch (cell.getCellType()) {
                case NUMERIC: // 数字
                    DecimalFormat df = new DecimalFormat("#.####");
                    df.setRoundingMode(RoundingMode.HALF_UP);
                    value = df.format(cell.getNumericCellValue());
                    break;
                case STRING: // 字符串
                    value = cell.getStringCellValue();
                    break;
                case BOOLEAN: // Boolean
                    value = cell.getBooleanCellValue() + "";
                    break;
                case FORMULA: // 公式
                    value = cell.getCellFormula();
                    break;
                case BLANK: // 空值
                    value = "";
                    break;
                case ERROR: // 故障
                    value = "非法字符";
                    break;
                default:
                    value = "未知类型";
                    break;
            }
        }
        return value;
    }


    // ===========================

    public static ExcelData getListExcelData(Sheet sheet){
        ExcelData excelData = new ExcelData();
        List<String> tableHeads = new ArrayList<>();
        // 获取到Excel文件中的所有行数
        int rows = sheet.getLastRowNum();
        log.info("获取到Excel文件中的所有行数:{}", rows);
        List<Object[]> templateFieldTemps = new ArrayList<>();
        //表头
        Row row;
        Object[] objs;
        String value;
        int columnsSize = 0;
        for (int i = 0; i <= rows; i++) {
            // 获取每一行
            row = sheet.getRow(i);
            if (row != null) {
                // 遍历列
                if (i == 0) {
                    // 判断表头是否符合规范
                    for (int j = 0; j < 30; j++) {
                        value = getCellValue(row.getCell(j));
                        if (row == null){
                            columnsSize = j;
                            break;
                        }
                        if (StringUtils.isEmpty(value)){
                            columnsSize = j;
                            break;
                        }
                        // 获取列的值
                        tableHeads.add(value);
                    }
                } else {
                    // 遍历数据行
                    objs = new Object[columnsSize];
                    for (int j = 0; j < columnsSize; j++) {
                        value = getCellValue(row.getCell(j));// 获取列的值
                        objs[j] = value;
                    }
                    templateFieldTemps.add(objs);
                }
            }
        }
        log.info("获取到Excel文件中数据行数:{}", templateFieldTemps.size());
        excelData.setTableHeads(tableHeads);
        excelData.setDataList(templateFieldTemps);
        return excelData;
    }
}
